package com.shilei.spring.aop.aop;

import com.shilei.spring.aop.able.Doable;

import java.lang.reflect.Method;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.Date;

/**
 * @author 石雷
 * shilei1@jiayuan.com
 * 2021/8/31/031 16:12
 */
public class LogAutoAop implements Aop{
    /**
     * 切面类必须实现此方法 指定 在方法前切入代码
     */
    @Override
    public void before(Class clazz, Method method, Object[] params) {
        System.out.println(LocalDateTime.now()+" " +clazz.getName().split("\\$\\$EnhancerByCGLIB")[0]+"."+method.getName()+" start ");
    }

    /**
     * 切面类必须实现此方法 环绕切入代码
     */
    @Override
    public Object around(Doable doable,Class clazz, Method method,Object[] params){
        before(clazz,method,params);
        Object o = null;
        try {
            o = doable.done();
        } catch (Throwable throwable) {
            error(throwable);
        }
        after(clazz,method,params);
        return o;
    }

    /**
     * 切面类必须实现此方法 指定 在方法后切入代码
     */
    @Override
    public void after(Class clazz, Method method,Object[] params) {
        System.out.println(LocalDateTime.now()+" " +clazz.getName().split("\\$\\$EnhancerByCGLIB")[0]+"."+method.getName()+" end ");
    }

    /**
     * 切面类必须实现此方法 当被切方法抛出异常的处理
     */
    @Override
    public void error(Throwable throwable) {
        //默认打印异常
        System.out.println("!!!问题不大:"+throwable.getMessage());

    }
}
